En los modelos de regresión que se han planteado se han contemplado únicamente modelos lineales; en este orden de ideas, se presenta los dos últimos modelos de este orden, los cuales corresponden a métodos de regularización, estos parten del modelo de regresión lineal al que se adiciona un factor de contracción. Las regresiones Ridge (L2) y Lasso (L1) son los métodos de regularización que se soportan en la minimización del RSS (Suma de residuos al cuadrado) al cual se le agrega un factor de penalización (o factor de contracción). El soporte matemático del método de regularización no es objeto del presente documento, sin embargo, una fuente recomendada para consultar o conocer el soporte teórico se encuentra en el la sección 6.2 del libro An Introduction to Statistical Learning Segunda edición, de los autores James, G., Witten, D., Hastie, T., & Tibshirani.
El desarrollo de esta parte del documento se soporta también en la sección 6.5.2 del libro ya mencionado; en este se recomienda el uso del método “validación cruzada tipo k-fold” con el fin de encontrar el factor de penalización que presente el mínimo de error en el modelo. Adicionalmente, se destaca que se hace uso de la librería “glmnet”.
R.Chollet, F., & Allaire, J. J en su libro Deep Learning with R mencionan que cuando un conjunto de datos no tiene una cantidad considerable de observaciones es recomendable hacer uso de la validación cruzada. No es muy claro (por lo menos en mi caso, no he encontrado una “formula” que me permita conocer el dato) cuál es la cantidad de observaciones óptima para concluir que son suficientes para trabajar únicamente con los subconjuntos Train y Test. La literatura si menciona que se debe procurar un “equilibrio” entre la cantidad de dimensiones (variables) y la cantidad de observaciones. Si se plantea que tenemos alrededor de 39 observaciones por cada variable (incluida la dependiente) se podría concluir que son muy pocas ya que en el libro en mención, en la sección 4.3.4, se dice que este conjunto de datos (Boston) posee muy pocas observaciones, y que plantear un subconjunto de validación (Test) con 100 observaciones (en promedio) es insuficiente, pues podría suceder que este subconjunto no represente adecuadamente el nivel de varianza que incluye el conjunto de entrenamiento (Train) y viceversa. En aquellos modelos de regresión en lo que se requiere encontrar el el optimo de uno o varios parámetros de tal manera que se minimice el error total del modelo,y que a su vez se tengan pocas observaciones, debería hacerse uso de la validación cruzada.
Existen varios métodos de validación cruzada, no obstante, para este planteamiento se usará la validación cruzada tipo k-fold, este consiste en dividir el conjunto de entrenamiento en k “pliegues” a fin de entrenar el modelo k veces, cada k entrenamiento entregará un valor de error (según la métrica de evaluación seleccionada), al final se hará un promedio de los k errores y este será el error de entrenamiento. En cada k entrenamiento se usa uno de los k pliegues para validar el entrenamiento que se hace con los k-1 pliegues restantes. Para un valor K = 5 lo anterior se observaría así:
El método de regularización ridge (L2) incluye, como factor de penalización en el RSS, la sumatoria de los coeficientes (de cada variable) al cuadrado y multiplicado por un valor lambda.
El modelo ridge que se presenta incluye el parámetro k = 5 en la validación cruzada k-fold (set.seed(2023)) y generación de valores lambda por defecto.
set.seed(2023)
lm_ridge <- glmnet(x = Xt, y = Yt, alpha = 0, standardize = TRUE) # Alpha = 0 para regularización tipo ridge
Coeficientes <- as.data.frame(t(as.matrix(coef(lm_ridge))))
Coeficientes <- data.frame(Coeficientes[,-1],Lambda = lm_ridge$lambda)
Coeficientes$Lambda = log(Coeficientes$Lambda)
Lineas <- names(Coeficientes)
# Creación del objeto gráfico
fig_ridge_lamda <- plot_ly(data = Coeficientes, x = ~Lambda)
# Bucle para agregar los trazados, uno por cada variable
i = 1
while (i <= (ncol(Coeficientes)-1)){
fig_ridge_lamda <- fig_ridge_lamda %>% add_trace(y = Coeficientes[,i],
mode = 'lines',
name = Lineas[i],
type = "scatter")
i = i + 1
}
fig_ridge_lamda <- fig_ridge_lamda %>% layout(title = list(text ='Coeficientes Vs Lambda',
y = 0.97, x = 0.1),
xaxis = list(title = 'log(Lambda)'),
yaxis = list(title = 'Coeficiente no estandarizado'),
legend = list(orientation = 'h',
x = 0, y = -0.3)
)
#Presentar el objeto
fig_ridge_lamda
{#Coeficientes <- pivot_longer(Coeficientes,1:19, values_to = "Coeficiente",} # names_to = "Variable")
#lm_ridge_cv <- cv.glmnet(x = Xt, y = Yt, alpha = 0,
# nfolds = 5,standardize = FALSE,
# lambda = grid) # Alpha = 0 para regularización tipo ridge
#plot(lm_ridge_cv)
#bestlam <- lm_ridge$lambda.min
#bestlam